package org.zjt.optional;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author juntao.zhang
 * @version V1.0
 * @Description: TODO
 * @Package org.zjt.optional
 * @date 2018/6/18 22:44
 *
 *
 * 函数：
 *
 *    orElse   option为空时候，则去拿该值。
 *
 *    flatMap  和map 一样，map 返回的是option内部bean。而faltmap 返回的是 option 直接数据。
 *
 *
 *    ifPresent  如果存在，则执行consumer 函数
 *
 *    orElseGet  当option为空时候，则返回其中的内容。
 *
 *
 *    orElseThrow 当option为空的时候，则抛出其中的异常。
 *
 *
 *
 */
@Slf4j
public class JdkOptionalTest {

    public static void main(String[] args) {
        Optional<Object> optional = Optional.ofNullable(null);
        log.info("Present:{}",optional.isPresent());                  //false

        log.info("Present:{}",Optional.empty().isPresent());         //false


        log.info("Present:{}",Optional.of("zhangsan").isPresent());  //true


        Optional<String> stringOptional = Optional.of("zhangsan");

        stringOptional.ifPresent(op -> log.info(op.toUpperCase()));

        // 过滤到所有不为空的对象
        String s = stringOptional.filter(String::isEmpty).orElse("ssss");
        log.info(s);


        // map 拆分字符串,返回包裹的对象
        String[] strings = stringOptional.map(a -> a.split("")).get();
        log.info("flatMap: {}",String.join(" ",strings));


        // flatMap 拆分字符串，返回一个直接的对象
        List<String> collect = stringOptional.flatMap(a -> Optional.of(Arrays.stream(a.split("")))).get().collect(Collectors.toList());
        log.info("flatMap: {}",String.join(" ",collect));

        // orElseGet 当option 为空，则执行函数，并返回。
        String s1 = stringOptional.orElseGet(() -> {
            log.info("------当结果为空，调用函数并执行。----");
            return "";
        });
        log.info("s1: {}",s1);


        // orElseThrow 当option 为空，抛出异常。
        String s2 = stringOptional.orElseThrow(() -> new RuntimeException("2222"));
        log.info("s2: {}",s2);

    }
}
